package org.az.netty_study.p01_nio组件之buffer;

import org.az.netty_study.ByteBufferUtil;

import java.nio.ByteBuffer;

/**
 * 所谓读模式和写模式，本质就是改变了buffer的position指针和limit指针
 * 还有其他方法可以改变指针
 */
public class _5_buffer的其他方法 {
    public static void main(String[] args) {
        ByteBuffer buffer = ByteBuffer.allocate(10);
        buffer.put(new byte[]{'a', 'b', 'c', 'd'});
        buffer.flip();

        //从ByteBuffer读取四个字节，此时position = 4,limit = 4
        buffer.get(new byte[4]);
        ByteBufferUtil.debugAll(buffer);
        //在读就会报错，因为position = limit = 最后一个下标索引的在下一位，表示读完了
        //buffer.get();

        /**
         * rewind方法：调用rewind方法，令position = 0,mark = -1
         * 所有可以实现重复读取
         */
        buffer.rewind();
        //又能愉快地get了
        buffer.get();
        ByteBufferUtil.debugAll(buffer);

        /**
         * mark & reset,这两个方法也能重新读
         * mark:做标记，记录下当前position的位置赋给mark
         * reset:重置，将position赋值为mark
         */
        buffer.mark();  //此时position = 1, 令mark = position = 1
        buffer.get(new byte[3]);
        ByteBufferUtil.debugAll(buffer);
        //上一步读取了三个字节后，position = 4，reset方法令position = mark = 1
        buffer.reset();
        ByteBufferUtil.debugAll(buffer);
        //get(int)方法不会改变position指针
        byte b = buffer.get(2);
        System.out.println((char) b);
        ByteBufferUtil.debugAll(buffer);
    }
}
